Skip to content
GitHub

Mongo Configuration

通过 docker 运行 mongo 数据库

 $ docker pull mongo
 $ docker images
 > REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
 > mongo        latest    32c5c1d795d9   2 weeks ago   644MB

 $ docker run -d --restart=always -p 27017:27017 --name mongodb -v /root/Desktop/Mongo:/data/db  mongo
 $ docker ps
 > CONTAINER ID   IMAGE  COMMAND                 CREATED        STATUS         PORTS                                           NAMES
 > b4da33977293   mongo  "docker-entrypoint.s…"  6 seconds ago  Up 5 seconds   0.0.0.0:27017->27017/tcp, :::27017->27017/tcp   mongodb
  • 以 mongo 为镜像, 创建容器 mongodb
  • 容器内 /data/db 目录挂载到系统 /root/Desktop/Mongo 目录下
  • 系统端口 27017 与容器内 27017 端口映射
 $ docker exec -it mongodb bash

 $ mongosh                                       # 进入 mongo shell, 早期版本使用 mongo 命令
 >

Mongo Shell

Mongo 中可以创建多个数据库, 数据库可以创建多个集合(类似于表), 集合用于存储数据

// 显示所有数据库
show dbs
admin    40.00 KiB
config  108.00 KiB
local    40.00 KiB

// 创建或切换数据库(数据库有数据才会创建, show 命令不显示)
use person
switched to db redis

// 显示当前数据库名称
db
person

// 数据库 test 的信息
db.stats()
{
  db: 'person',
  collections: Long('0'),
  views: Long('0'),
  objects: Long('0'),
  avgObjSize: 0,
  dataSize: 0,
  storageSize: 0,
  indexes: Long('0'),
  indexSize: 0,
  totalSize: 0,
  scaleFactor: Long('1'),
  fsUsedSize: 0,
  fsTotalSize: 0,
  ok: 1
}

// 删除数据库 person
db.dropDatabase()
{ ok: 1, dropped: 'person' }
// 查看数据库内的所有集合
show collections
{ ok: 1 }

// 创建集合, 并配置(集合有数据才会创建)
db.createCollection(name, option)
db.createCollection("students", { capped : true, size : 5242880, max : 5000 })

// 查看 students 集合状态
db.students.stats()

// 删除 students 集合
db.students.drop()

// 集合的数据数量
db.students.countDocuments()
// 查看集合所有索引(排序方式, 字段约束)
db.students.getIndexes()
[
  { v: 2, key: { _id: 1 }, name: '_id_' },
]

// 添加 name 字段升序(1 升序, -1 降序), 且 name 字段值唯一约束(unique)
db.students.createIndex({name: 1}, {unique: true})
db.students.getIndexes()
[
  { v: 2, key: { _id: 1 }, name: '_id_' },
  { v: 2, key: { name: 1 }, name: 'name_1', unique: true }
]
optiontypedescription
cappedBooleantrue: 集合启用 size 限制, 超过部分自动覆盖最早的条目。启动该选项同时也需指定 size 数值
sizenumber设定集合最大可使用字节数。capped 为 true 时设置
maxnumber设置集合能容纳的最大文档数量。Size 限制优先于数量限制。文档数量未到 max, size 到达限制时也会触发文档覆盖
  • insertOne
  • insertMany
// 插入单个数据
db.student.insertOne({name: "John", age: 19})
{
  acknowledged: true,
  insertedId: ObjectId('65d1fe9776bc4fe476eabd1a')
}

// 插入多个数据
db.coll.insertMany([
  { name: "lily"},
  { name: "Alice", hobby: "swim"}
])
  • findOne
  • find
// 查询匹配的第一个数据(返回匹配的第一个数据)
db.students.findOne({name: 'lily'})
{ _id: ObjectId('65d200a776bc4fe476eabd1e'), name: 'lily' }

// 查询所有匹配的数据
db.students.find({})
[
  { _id: ObjectId('65d1ff0e76bc4fe476eabd1b'), name: 'John', age: 19 },
  { _id: ObjectId('65d200a776bc4fe476eabd1e'), name: 'lily' },
  {
    _id: ObjectId('65d200a776bc4fe476eabd1f'),
    name: 'Alice',
    hobby: 'swim'
  }
]

// 数据范围查询($gt $gte $lt $lte $ne $in)
db.students.find({age: {$gt: 15}})
[
  { _id: ObjectId('65d1ff0e76bc4fe476eabd1b'), name: 'John', age: 19 }
]

// 属性存在查询
db.students.findOne({hobby: {$exists: true}})
{
  _id: ObjectId('65d200a776bc4fe476eabd1f'),
  name: 'Alice',
  hobby: 'swim'
}

// 值的正则匹配查询
db.students.find({name: {$regex:'lily|John'}})
[
  { _id: ObjectId('65d1ff0e76bc4fe476eabd1b'), name: 'John', age: 19 },
  { _id: ObjectId('65d200a776bc4fe476eabd1e'), name: 'lily' }
]

// 逻辑或查询
db.students.find({$or: [{name: 'lily'}, {name: 'Alice'}]})
[
  { _id: ObjectId('65d200a776bc4fe476eabd1e'), name: 'lily' },
  {
    _id: ObjectId('65d200a776bc4fe476eabd1f'),
    name: 'Alice',
    hobby: 'swim'
  }
]
  • updateOne
  • updateMany

db.coll.updateMany(filter, set)

// 更新单个数据
db.students.updateOne({name: 'lily'}, {$set: {"age": 18} })
db.students.findOne({name: 'lily'})
{ _id: ObjectId('65d200a776bc4fe476eabd1e'), name: 'lily', age: 18 }

// 更新多个数据
db.students.updateMany({name: {$exists: true}}, {$set: {"description": "school student"} })
db.students.find({})
[
  {
    _id: ObjectId('65d1ff0e76bc4fe476eabd1b'),
    name: 'John',
    age: 19,
    description: 'school student'
  },
  {
    _id: ObjectId('65d200a776bc4fe476eabd1e'),
    name: 'lily',
    age: 18,
    description: 'school student'
  },
  {
    _id: ObjectId('65d200a776bc4fe476eabd1f'),
    name: 'Alice',
    hobby: 'swim',
    description: 'school student'
  }
]

// 重命名字段
db.students.updateOne({name: 'lily'}, {$rename: {"description": "desc"} })
db.students.findOne({name: 'lily'})
{
  _id: ObjectId('65d200a776bc4fe476eabd1e'),
  name: 'lily',
  age: 18,
  desc: 'school student'
}

// 删除字段
db.students.updateOne({name: 'Alice'}, {$unset: {"hobby": ""} })
db.students.findOne({name: 'Alice'})
{
  _id: ObjectId('65d200a776bc4fe476eabd1f'),
  name: 'Alice',
  description: 'school student Alice'
}
  • deleteOne
  • deleteMany

db.coll.deleteMany(filter)

// 删除单个数据
db.students.deleteOne({name: "Alice"})
db.students.find({})
[
  {
    _id: ObjectId('65d1ff0e76bc4fe476eabd1b'),
    name: 'John',
    age: 19,
    description: 'school student'
  },
  {
    _id: ObjectId('65d200a776bc4fe476eabd1e'),
    name: 'lily',
    age: 18,
    desc: 'school student'
  }
]

// 删除多个数据
db.students.deleteMany({})
{ acknowledged: true, deletedCount: 2 }
db.students.find({})
  • mongodump
  • mongorestore
# 备份/恢复 mongo 全部数据到 /data/db/mongo_backup 路径下(映射路径, 方便取出)
$ mongodump --out  /data/db/mongo_backup
$ mongorestore  /data/db/mongo_backup

# 备份和恢复指定数据库到指定路径
$ mongodump --db database_name --out path
$ mongorestore --db database_name --out path

# 备份和恢复特定集合到指定路径
$ mongodump --db database_name --collection coll_name --out path
$ mongorestore --db database_name --collection coll_name  --out path